home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
util
/
libs
/
SSLib51.lha
/
SS.i
< prev
next >
Wrap
Text File
|
1995-01-16
|
18KB
|
488 lines
; The Special Support Library
; (c) 1993,1994 Martin Mares, MJSoft System Software
; --------------------------------------------------------------------------
; Fields marked with 'R' are read-only, 'P' are private...
; Library Version
SSVer equ 5
; Library Vector Offsets
_FuncOffset set -30
Func macro *fname
_LVO\1 equ _FuncOffset
_FuncOffset set _FuncOffset-6
endm
; Program startup and exit
Func StartupInit ; (A0=StartupStruct,D7=WbMsg)
Func ExitCleanup ; ()
Func ExitError ; (A0=Text,A1=Params)
Func DisplayError ; (A0=Text,A1=Params)
Func DosError ; (A0=optional text,A1=Params)
Func ReportError ; (D0=ErrorCode,A1/D2/D3=Params)
Func TestBreak ; ()
; Miscellaneous services
Func Printf ; (A0=Text,A1=Params)
Func Puts ; (A0=Text)
Func PutsNL ; (A0=Text)
Func FormatStr ; (A0=Format,A1=Data,A2=DestBuf)
Func StrCat ; (A0=Dest,A1=Source) -> A0=AfterPtr
Func StrToL ; (A0=String)
Func ParseArgs ; (A0=Src,A1=Tmpl,A2=ExHelp,A3=StoreTo,
; D0=Flags)
; General tracking services
Func CreateResList ; ()
Func GetResList ; ()
Func FreeResList ; ()
Func FreeAllResLists ; ()
Func TrackObject ; (D0=type)
Func FreeObject ; (A0=tracker)
Func TrackRoutine ; (A0=routine,A1=args)
Func TrackExtd ; (D0=type,D1=extsize)
Func TrackSlave ; (A0=master,A1=slave)
; Special tracking services
Func TrackAllocMem ; (D0=size,D1=requirements)
Func TrackAlloc ; (D0=size)
Func TrackOpen ; (A0=name,D0=openmode)
Func TrackLock ; (A0=name,D0=lockmode)
Func TrackPort ; ()
Func TrackIoRq ; (A0=OptionalPort,D0=size or 0)
Func TrackSignal ; ()
Func TrackDevice ; (A0=DevName,A1=IORQ,D0=unit,D1=flags,
; A2=ErrorTable)
Func TrackLibrary ; (A0=LibName,D0=version)
Func TrackDosObject ; (D0=Type,A0=Tags)
; File operations
Func LoadFile ; (A0=name)
Func ChkRead ; (A0=tracker,A1=buffer,D0=size)
Func ChkWrite ; (A0=tracker,A1=buffer,D0=size)
; Hashed trees
Func InitHashTree ; (D0=NumBranches,D1=Flags)
Func AddHashItem ; (A0=HashTree,A1=Name,D0=DataSize)
Func FindHashItem ; (A0=HashTree,A1=Name)
; Filename manipulation
Func AddExtension ; (A0=Source,A1=Dest,A2=Ext,D0=MaxSize)
Func SetExtension ; (A0=Source,A1=Dest,A2=Ext,D0=MaxSize)
Func GetExtension ; (A0=FileName)
Func RemExtension ; (A0=FileName)
; Next generation of names ...
Func ChkDoIO ; (A0=Messsage,A1=DeviceTracker)
Func SimpleRequest ; (A0=Msg,A1=Params,A2=Gadgets)
; Private functions allowing SS extensions
Func AddSSExtens ; (A0=ExtNode)
Func RemSSExtens ; (A0=ExtNode)
; Version 3: Memory allocation with pools
Func TrackPool ; (D0=Quantum,D1=Threshold,D2=Flags)
Func PoolAlloc ; (A0=Pool,D0=size)
Func PoolFree ; (A0=Pool,A1=Address,D0=Size)
Func TrackLinPool ; (D0=Quantum,D1=Flags)
Func LinearAlloc ; (A0=Pool,D1=size)
Func LinearAllocN ; (A0=Pool,D1=size)
; Version 4: Sorting and misc
Func MergeResLists ; ()
Func CallBlock ; (A0=Routine,D0=LeaveResources)
Func QuickSort ; (A0=Field,D0=NumEl,D1=ElSize,A1=CFunc)
Func SortStrings ; (A0=Field,D0=NumEl)
Func SortLongs ; (A0=Field,D0=NumEl)
Func SortList ; (A0=List,A1=CompFunc)
Func SortListName ; (A0=List)
Func TrackAllocPub ; (D0=Size)
Func RelinkObject ; (A0=Object)
Func TestStack ; ()
; Version 5: Buffered I/O
Func TrackOpenBuf ; (A0=name,D0=openmode,D1=bufsize)
Func TrackOpenBufFH ; (A0=name,D0=openmode,D1=bufsize,D2=fh)
Func TrackBufHandle ; (A0=name,D0=openmode,D1=bufsize)
Func ChkTryRead ; (A0=tracker,A1=buffer,D0=size)
Func BGetByte ; (A2=tracker)
Func BGetWord ; (A2=tracker)
Func BGetLong ; (A2=tracker)
Func BPutByte ; (D0=char,A3=tracker)
Func BPutWord ; (D0=char,A3=tracker)
Func BPutLong ; (D0=char,A3=tracker)
Func BPutChar ; (D0=char,A3=tracker)
Func BPutString ; (A0=string,A3=tracker)
Func BGetString ; (A0=buf,D0=size,A2=tracker)
Func BPuts ; (A0=string,A3=tracker)
Func BPutsNL ; (A0=string,A3=tracker)
Func BGets ; (A0=buf,D0=size,A2=tracker)
Func BPrintf ; (A0=string,A1=data,A3=tracker)
Func BRead ; (A0=tracker,A2=buffer,D0=size)
Func BWrite ; (A0=tracker,A3=buffer,D0=size)
Func BSeek ; (A2=tracker,D0=offset)
Func BRelSeek ; (A2=tracker,D0=offset)
Func BTell ; (A2=tracker)
Func BUnGetc ; (D0=char,A2=tracker)
Func BFlush ; (A2=tracker)
; And some additional services:
Func IPAlloc ; (D0=size)
Func IPFree ; (A1=address,D0=size)
; System Variables
_SysVarCnt set 0
SysVar macro *size,name
_SysVarCnt set _SysVarCnt-\1
\2 equ _SysVarCnt
endm
SysVar 0,ssbase ;R Library base
SysVar 4,sv_basesize ;P Size of system vars + user data above
SysVar 4,sv_wbmsg ;R Workbench message (0=CLI)
SysVar 4,sv_thistask ;R Pointer to task node
SysVar 4,sv_errsp ;R Stack pointer to program return address
SysVar 4,sv_checkbase ;P Base checkpoint - (0-BaseAddress)
SysVar 4,dosbase ;R Dos base
SysVar 4,intuitionbase ;R Intuition base
SysVar 4,gfxbase ;R Graphics base
SysVar 4,gadtoolsbase ;R Gadtools base
SysVar 4,utilitybase ;R Utility base
SysVar 4,stdin ; Standard input stream
SysVar 4,stdout ; Standard output stream
SysVar 4,stderr ; Standard error stream
SysVar 4,sv_errsw ; Error switches (bitmap)
SysVar 4,sv_progname ; Program name
SysVar 4,sv_errrc ; ReturnCode for error, default=10
SysVar 12,sv_reslistlist ;P A list of resource lists
SysVar 8,sv_callernode ;P Node of CallerList
SysVar 4,sv_rc ; ReturnCode
SysVar 4,sv_wbcon ;P Workbench console
SysVar 4,sv_template ;P Program template
SysVar 4,sv_extrahelp ;P Program extra help string
SysVar 4,sv_envvar ;R Environment variable name
SysVar 4,sv_exitrout ; Subroutine called before res.freeing
; (this pointer is cleared before calling)
SysVar 4,sv_msgrout ; Error message routine
; (this pointer is cleared before calling)
SysVar 4,sv_oldexcept ;P Pointer to original exception routine
SysVar 4,sv_flags ; Various flags (see below)
SysVar 4,sv_argdest ;P Address to store arguments at
SysVar 4,sv_iconbase ;P Pointer to IconBase
SysVar 4,sv_usertrk ; Pointer to UserTrkTypes structure or 0
SysVar 24,sv_mempool ;P Task memory pool
SysVar 4,sv_lowmem ; Routine to be called when out of mem.
SysVar 4,sv_stklimit ; The lowest allowed SP value
SysVar 4,sv_defstderr ;P Default stderr or 0
SysVar 4,sv_memattr ; Memory attributes for TrackAllocPub
SysVar 0,sv_sizeof ; Size of system variables block
; Flags in sv_flags
svfb_nowbargs equ 0 ; Ignore WB arguments
svfb_noprogname equ 1 ; Don't print program's name in CLI error msgs
svfb_errorreq equ 2 ; Always use requesters for error msgs
svfb_intrap equ 3 ;P Running trap handler
svfb_nostderr equ 4 ;P sst_nostderr specified
svfb_noiconarg equ 5 ; Don't pass names of multiselected icons as arg #1
svfb_nocliargs equ 6 ; Pass CLI arguments directly w/o processing
svfb_dontfree equ 7 ;P Don't free memory from task mempool
svfm_nowbargs equ 1
svfm_noprogname equ 2
svfm_errorreq equ 4
svfm_intrap equ 8
svfm_nostderr equ 16
svfm_noiconarg equ 32
svfm_nocliargs equ 64
svfm_dontfree equ 128
; SS.library Base
_LibCnt set LIB_SIZE
LibVar macro *size,name
ssb_\2 equ _LibCnt
_LibCnt set _LibCnt+\1
endm
LibVar 4,seglist ;P SegList
LibVar 2,ksversion ;R Kickstart version
LibVar 1,flags ; Some flags (see below)
LibVar 1,pad ;P Not used yet
LibVar 4,dosbase ;R DosBase
LibVar 4,intuibase ;R IntuitionBase
LibVar 4,gfxbase ;R GraphicsBase
LibVar 4,gadtoolsbase ;R GadtoolsBase
LibVar 4,utilitybase ;R UtilityBase
LibVar 12,callerlist ;P A list of callers -used for crash recovery
LibVar 1,cputype ;R CPU type (see tags for IDs)
LibVar 1,fputype ;R FPU type ( -- "" -- )
LibVar 16,extlist ;P SS Extensions
LibVar 2,opencnt ;P Private OpenCount
LibVar SS_SIZE,callis ;P Callerlist semaphore
LibVar 0,sizeof
; Flags in ssb_flags
SSB_allow30 equ 0 ;R KS 3.0 services can be used
; Startup structure
pa_varsize equ 0 ; Size of user's variables, incl. ssbase
pa_reqssver equ 2 ; Required version of ss.library
pa_firsttag equ 4 ; First tag
; Tag types
sstag_old equ $0000 ; Old SSLib tags
sstag_ext equ $4000 ; Extended tags
sstag_std equ $8000 ; Standard tags (two longwords)
sstag_new equ $C000 ; New tags (ignored when not understood)
sstag_nopar equ $0000 ; No parameters or special processing
sstag_word equ $1000 ; One word
sstag_long equ $2000 ; One longword
sstag_string equ $3000 ; One string
; Tags
; (The tag array = { DC.W TagType [ Parameters ] EVEN } ... )
; RelPtr = APTR - *
sst_finish equ 0 ; End of the TagList
sst_wbconsole equ 1 ; Create console if started from WB
sst_template equ 2 ; Template: STR,A5-offset-to-store-args-on
sst_usertrk equ 3 ; Define UserTrkTypes: WORD RelPtr
sst_extrahelp equ 4 ; Extra help string: STR
sst_exitrout equ 5 ; Exit routine: WORD RelPTR
sst_usererr equ 6 ; Err routine: WORD RelPTR
sst_nowbstart equ 7 ; Forbid start from workbench
sst_library equ 8 ; Open library: STR,WORD MinVer,WORD BaseOffset
sst_trylib equ 9 ; Try to open library (don't fail) - same as ^
sst_nowbargs equ 10 ; Ignore WB arguments
sst_noprogname equ 11 ; Don't print program's name in error messages
sst_cputype equ 12 ; Required CPU type: BYTE Min,Max
; 0..4=68000..68040,-1=NoMax
sst_fputype equ 13 ; Required FPU type: BYTE Min,-1 (max not supported)
; 0=none,1=68881,2=68882,3=68040
sst_sysver equ 14 ; Required kickstart version: BYTE Min,Max(-1=NoMax)
sst_errorreq equ 15 ; Forces using of requesters for error messages
sst_nostderr equ 16 ; stderr=stdout (don't open '*')
sst_errors equ 17 ; Disable automatic error processing:
; (default is to write an error message and exit)
; LONG ErrBitMap
sst_wbconname equ 18 ; WB Console specified by name: STR FileName
sst_envvar equ 19 ; ENV variable: STR
sst_last equ 20
sst_poolsize equ $E000 ; Set size of task private mempool: LONG size
PMP_DEFSIZE equ 512 ; Default value
sst_poolthresh equ $E001 ; Set threshold of priv. mempool: LONG threshold
PMP_DEFTHRESH equ 373 ; Default value
sst_noiconarg equ $C002 ; Don't use names of multiselected icons as arg #1
sst_nocliargs equ $C003 ; Pass CLI arguments directly without any processing
; Error numbers - normal errors - can be disabled (-> 0 is returned as a result)
err_memory equ 0 ; Insufficient memory
err_openread equ 1 ; Unable to open file %s for reading
err_openwrite equ 2 ; Unable to open file %s for writing
err_lock equ 3 ; Unable to access %s (usually when locking)
err_signal equ 4 ; Unable to get free signal
err_device equ 5 ; Unable to open device %s
err_read equ 6 ; Error reading file %s
err_write equ 7 ; Error writing file %s
err_break equ 8 ; Break
err_port equ 9 ; Unable to get message port
err_iorq equ 10 ; Unable to get iorq
err_library equ 11 ; You need %s.library
err_library2 equ 12 ; You need version %ld of %s.library
err_number equ 13 ; Bad number
err_iofail equ 14 ; %s: %s error #%ld (ChkDoIO failed, unknown error)
err_iofail2 equ 15 ; %s: %s (ChkDoIO failed, error found in table)
err_interact equ 16 ; File %s is interactive and cannot be loaded
err_stack equ 17 ; Stack overflow. Turning off ignored.
err_unpack equ 18 ; Error while decrunching
err_seek equ 19 ; Seek error on %s
err_over equ 20 ; Buffer overflow while reading %s
err_maximal equ 21
; Alerts
AN_SSLIB equ $35530000
AN_ExitCrash equ $35530001 ; ExitCleanup can't locate caller
AN_BadTag equ $35530002 ; Invalid tag ID encountered
AN_BadTracker equ $35530003 ; Invalid tracker ID in FreeObject()
AN_BadUsrTrkr equ $35530004 ; Bad user tracker ID in FreeObject()
AN_BadExtTrkr equ $35530005 ; Bad extension tracker ID, FreeObject()
AN_FreeObject equ $35530006 ; Freeing already freed tracker
AN_DupSlave equ $35530007 ; Slave of two masters (TrackSlave())
AN_PoolFree equ $35530008 ; MemList not found
AN_AllocZero equ $35530009 ; Attempt to allocate 0 bytes of memory
AN_IoNotSupported equ $3553000A ; Attempt to write a read stream etc.
; Resource list, must be allocated by CreateResList, freed by FreeResList
resl_node equ 0 ; Standard MinNode
resl_list equ 8 ; Standard MinList of resource trackers
resl_sizeof equ 20
; Resource tracker, must be allocated and freed using SSLib
trk_node equ 0 ; Standard MinNode
trk_type equ 8 ;R Tracker type (byte)
trk_flags equ 9 ;R Tracker flags (byte)
trk_size equ 10 ;R Size of tracker node (word)
trk_chain equ 12 ;R Pointer to next slave in chain
trk_data equ 16 ; First data longword
trk_ext equ 20 ; Second data longword
trk_sizeof equ 24
; Tracker flags
trf_master equ 0 ;P Is a master tracker
trf_slave equ 1 ;P Is a slave tracker
; UserTrkTypes structure
utt_nr equ 0 ; Number of user tracker types
utt_flags equ 1 ; Reserved for future use
utt_addrs equ 2 ; Array of RelPtrs to freeing routines
; Routines called with: A0=tracker
; A2=pointer to trk_data in the tracker
; Standard tracker types
trt_null equ 0 ; Do nothing - you can use it freely
trt_routine equ 1 ; Call routine (trk_data=routine)
trt_memory equ 2 ; Free memory (address,length)
trt_file equ 3 ; Close file (handle,name)
trt_lock equ 4 ; Unlock lock (lock,name)
trt_port equ 5 ; Remove port (port)
trt_iorq equ 6 ; Remove IoRequest (iorq,port tracker)
trt_signal equ 7 ; Free signal (signal)
trt_device equ 8 ; Close device (iorq,-,errtable)
trt_library equ 9 ; Close library (libbase)
trt_dosobj equ 10 ; Free dos object (object,type)
trt_diskobj equ 11 ;P FreeDiskObject() (used by WB startup)
trt_mempool equ 12 ;P Free memory pool
trt_args equ 13 ;P Free argument buffer
trt_linpool equ 14 ;P Free linear memory pool
trt_bufioh equ 15 ; Buffered I/O handle
trt_max equ 16 ; Number of standard tracker types
trt_free equ $3F ;P Freed tracker (Freeing causes alert)
trt_ext equ $40 ;P First tracker type reserved for SSLib
;P extensions
trt_extmax equ $7F ;P Last type for extensions
trt_user equ $80 ; First tracker type available to user
trt_usermax equ $FF ; Last tracker type available to user
; Special open modes
OPEN_NEW equ -1 ; Create new file (MODE_NEWFILE)
OPEN_OLD equ -2 ; Open old file R/W (MODE_OLDFILE)
OPEN_APPEND equ -3 ; MODE_READWRITE and seek to end
; Hashed tree - internal structure stored in HashTree tracker
htr_numbr equ trk_sizeof+0 ;P Number of branches - 1
htr_flags equ trk_sizeof+4 ;P Flags
htr_pad equ trk_sizeof+5 ;P Unused
htr_partsize equ trk_sizeof+6 ;P Size of each tree part
htr_firstpart equ trk_sizeof+10 ;P Pointer to first tree part
htr_partfree equ trk_sizeof+14 ;P Free bytes in first tree part
htr_hashtable equ trk_sizeof+18 ;P Pointer to hash table
htr_sizeof equ 22
partsize_def equ 4096 ;P Default part size
; Hashed tree flags
htf_nocase equ 0 ; Case insensitive
htb_nocase equ 1
; Hashed tree part
hpa_nextpart equ 0 ;P Pointer to next part
hpa_partdata equ 4 ;P Data stored in this part
; Hashed tree item
hit_next equ 0 ;P Next entry with the same hash value
hit_udsize equ 4 ;R Size of user data
hit_ud equ 6 ; User data followed by key string
; Memory pool - internal structure stored in MemPool tracker
mpt_quantum equ trk_data ;P Memory quantum
mpt_thresh equ trk_ext ;P Allocation threshold
mpt_flags equ trk_sizeof+0 ;P Memory flags
mpt_fraglist equ trk_sizeof+4 ;P List of memory fragments
mpt_sizeof equ trk_sizeof+16
; Memory fragment header
mfr_node equ 0 ;P MemHeader of this fragment
mfr_size equ MH_SIZE ;P Size of memory fragment header
; Linear memory pool - stored in LinPool tracker
lmp_quantum equ trk_data ;P Memory quantum
lmp_flags equ trk_ext ;P Memory flags
lmp_first equ trk_sizeof+0 ;P First fragment
lmp_free equ trk_sizeof+4 ;P First free zone
lmp_last equ trk_sizeof+8 ;P End of this free zone
lmp_sizeof equ trk_sizeof+12
; ParseArgs flags
pafb_nofail equ 0 ; Return 0 on errors (default: msg+exit)
pafb_noclear equ 1 ; Don't clear argument field (leave defaults)
pafb_ignorea equ 2 ; Don't check presence of /A arguments
pafm_nofail equ 1
pafm_noclear equ 2
pafm_ignorea equ 4
; Extension node (private)
exn_number equ 0 ;P extension number (0-3)
exn_rfu equ 1 ;P should be 0
exn_trktypes equ 2 ;P pointer to UserTrk-style array
exn_sizeof equ 6
; Buffered I/O Handle Tracker
bh_handle equ trk_data ; File handle (passed to I/O routines)
bh_name equ trk_ext ; File name (for error reports)
bh_readfunc equ trk_sizeof ; Function for reading (Trk,Buf,Size)
bh_writefunc equ trk_sizeof+4 ; Function for writing (Trk,Buf,Size)
bh_seekfunc equ trk_sizeof+8 ; Function for seeking (Trk,AbsPos)
bh_bufsize equ trk_sizeof+12 ;R Buffer size
bh_buffer equ trk_sizeof+16 ;R Pointer to buffer start
bh_current equ trk_sizeof+20 ; Pointer to current pos'n in buffer
bh_dataend equ trk_sizeof+24 ;R Pointer to 1st byte after data in buf
; (read streams only)
bh_bufend equ trk_sizeof+28 ;R Pointer to 1st byte after buffer
bh_position equ trk_sizeof+32 ;R Position of 1st char in buffer
bh_a5 equ trk_sizeof+36 ;P Backup of caller's A5
bh_eofhook equ trk_sizeof+40 ; Routine to be called on EOF
bh_flags equ trk_sizeof+44 ;R Flags (byte)
bh_pad equ trk_sizeof+45 ;P RFU
bh_arg1 equ trk_sizeof+46 ; Reserved for I/O routines
bh_arg2 equ trk_sizeof+50 ; Reserved for I/O routines
bh_sizeof equ trk_sizeof+54
; Buffered I/O Flags
biob_read equ 0 ;P Read stream
biob_write equ 1 ;P Write stream
biob_linebuf equ 2 ;P Line buffering
biob_closefh equ 3 ;P bh_handle contains FH to be freed
biob_eof equ 7 ;R EOF encountered
biof_read equ 1
biof_write equ 2
biof_linebuf equ 4
biof_closefh equ 8
biof_eof equ 128
; Buffered I/O Open Flags (ADDed, not ORed !!!)
OPEN_LINEBUF equ 16 ; Use line buffering if interactive